//
//  Matrix.h
//  3DMathSDK
//
//  Created by admin on 16/7/6.
//  Copyright © 2016年 douyu. All rights reserved.
//

#ifndef Matrix_h
#define Matrix_h

#include <stdio.h>
#include <stdbool.h>
#include "Vector3.h"
#include "DataType.h"

const extern Matrix kMatrix4Identity;
const extern Matrix kMatrixZero;

// 创建一个矩阵
Matrix MatrixMake(int row, int column, float data[row*column]);

// 三分向量转矩阵
Matrix MatrixFromVector3(Vector3 vec);

// 矩阵转三分向量
Vector3 Vector3FromMatrix(Matrix mat);

// 判断两个矩阵是否相等
bool isMatrixEqual(Matrix mat1, Matrix mat2);

// 是否是单位矩阵
bool isIdentityMatrix(Matrix mat1);

// 是否是正交矩阵
bool isOrthogonalMatrix(Matrix mat1);

// 矩阵相乘
Matrix multiply(Matrix mat1, Matrix mat2);

// 矩阵转置
Matrix transpose(Matrix mat);

// 伴随矩阵
Matrix adjointMatrix(Matrix mat);

// 代数行列式
float determinant(Matrix mat);

// 余子式
Matrix cofactorMatrix(Matrix mat, int rowT, int columnT);

// 代数余子式
float cofactor(Matrix mat, int row, int column);

// 逆矩阵
Matrix inverseMatrix(Matrix mat);

// 打印一个矩阵
void printMatrix(Matrix mat);

// 访问矩阵的数值指针
float *MatrixDataPointer(Matrix matrix, int row, int column);

#pragma mark - 变换矩阵
#pragma mark -

#pragma mark 旋转矩阵
// 绕单位向量旋转
Matrix rotateVector3Matrix(Vector3 vec, float angle);

#pragma mark - 缩放矩阵
// 向量方向缩放
Matrix scaleVector3Matrix(Vector3 vec, float scale);

#pragma mark - 投影矩阵
// 对向量为法线的平面投影
Matrix projectionVector3Matrix(Vector3 vec);

#endif /* Matrix_h */
